package demo;


import demo.Fase;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
import java.io.IOException;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.game.TiledLayer;

/**
 *
 * @author tmp
 */
public class FaseFazenda extends Fase{

    public FaseFazenda() {
    }

    public void init(DemoGameCanvas jogo) throws IOException {
        TiledLayer tlWater;
        TiledLayer tlMudarFase;
        TiledLayer tlCerca;
        TiledLayer tlBase;

        
        
        tlCerca = jogo.getGameDesign().getCerca();
        tlWater = jogo.getGameDesign().getWater();
        tlBase = jogo.getGameDesign().getFazenda();
        tlMudarFase = jogo.getGameDesign().getMudarFase1();

        //Camada para mudar de fase
        this.camadaMudarFase = tlMudarFase;
        
        //Telas sem colisão - primeira é a base (orienta o viewport)
        this.telasSemColisao.addElement(tlBase);
        this.telasSemColisao.addElement(tlMudarFase);

        //Telas com colisão


        this.telasColisao.addElement(tlWater);
        this.telasColisao.addElement(tlCerca);


        //Caçadores
        //Caçador1
        int [][] seq = new int[4][4];
        seq[0] = jogo.getGameDesign().MaterazziFrente;
        seq[1] = jogo.getGameDesign().MaterazziCosta;
        seq[2] = jogo.getGameDesign().MaterazziEsquerda;
        seq[3] = jogo.getGameDesign().MaterazziDireita;

        int[] qtdMoviment = new int[4];
        qtdMoviment[0] = 8;
        qtdMoviment[1] = 8;
        qtdMoviment[2] = 30;
        qtdMoviment[3] = 30;

        Materazzi materazzi = new Materazzi(jogo,jogo.getGameDesign().getMaterazzi(),seq,jogo.getGameDesign().MaterazziFrenteDelay,qtdMoviment, null);
        this.cacadores.addElement(materazzi.getSprite());

        int [][] seq2 = new int[4][4];
        seq2[0] = jogo.getGameDesign().VisaoFrente;
        seq2[1] = jogo.getGameDesign().VisaoCosta;
        seq2[2] = jogo.getGameDesign().VisaoEsquerda;
        seq2[3] = jogo.getGameDesign().VisaoDireita;

        Materazzi thomas = new Materazzi(jogo,jogo.getGameDesign().getVisao(),seq2,jogo.getGameDesign().VisaoFrenteDelay,qtdMoviment, materazzi.getSprite());
        this.cacadores.addElement(thomas.getSprite());



        jogo.getGameDesign().updateLayerManagerForFaseFazenda(jogo.getLayerManager());

        
    }

    public boolean spriteCollides(Sprite sprite) {

        boolean colidiu = false;


            //colisão com a tela
            colidiu =  sprite.getX() < 0 || sprite.getY() < 0
                || sprite.getX() > (((TiledLayer)this.telasSemColisao.elementAt(0)).getWidth() - sprite.getWidth())
                || sprite.getY() > (((TiledLayer)this.telasSemColisao.elementAt(0)).getHeight() - sprite.getHeight());

            int indice = 0;
            
            //Colisao com as camadas
            while(!colidiu && indice < telasColisao.size()){
                TiledLayer tela = (TiledLayer) telasColisao.elementAt(indice);
                colidiu = colidiu || sprite.collidesWith(tela, true);
                indice++;
            }

            //Colisao com os Personagens
  
        return colidiu;
    }

    public void adjustViewport(int x, int y) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void run() {
        
    }

    public void stop() {
        //parar as movimentações
    }


    public void adjustViewport(DemoGameCanvas jogo, int x,int y){
        int sx = jogo.getSpriteBode1().getX();
        int sy = jogo.getSpriteBode1().getY();

        int xmin = jogo.getViewPortX() +jogo.MIN_BUFFER;
        int xmax = jogo.getViewPortX() + jogo.getWidth() - jogo.getSpriteBode1().getWidth() - jogo.MIN_BUFFER;
        int ymin = jogo.getViewPortY() + jogo.MIN_BUFFER;
        int ymax = jogo.getViewPortY() + jogo.getHeight() - jogo.getSpriteBode1().getHeight() - jogo.MIN_BUFFER;

        //if the sprite is not near the any screen edges don't adjust
        if (sx >= xmin && sx <= xmax && sy >= ymin && sy <= ymax) {
            return;
        }

        //if the sprite is moving left but isn't near the left edge of the screen don't adjust
        if (jogo.getLastDirection() == jogo.LEFT && sx >= xmin) {
            return;
        }
        //if the sprite is moving right but isn't near the right edge of the screen don't adjust
        if (jogo.getLastDirection() == jogo.RIGHT && sx <= xmax) {
            return;
        }
        //if the sprite is moving up but isn't at near top edge of the screen don't adjust
        if (jogo.getLastDirection() == jogo.UP && sy >= ymin) {
            return;
        }
        //if the sprite is moving down but isn't at near bottom edge of the screen don't adjust
        if (jogo.getLastDirection() == jogo.DOWN && sy <= ymax) {
            return;
        }

        //only adjust x to values that ensure the base tiled layer remains visible
        //and no white space is shown
        if (x < ((TiledLayer)this.telasSemColisao.elementAt(0)).getX()) {
            jogo.setViewPortX(((TiledLayer)this.telasSemColisao.elementAt(0)).getX());
        } else if (x > ((TiledLayer)this.telasSemColisao.elementAt(0)).getX() + ((TiledLayer)this.telasSemColisao.elementAt(0)).getWidth() - jogo.getWidth()) {
            jogo.setViewPortX(((TiledLayer)this.telasSemColisao.elementAt(0)).getX() + ((TiledLayer)this.telasSemColisao.elementAt(0)).getWidth() - jogo.getWidth());
        } else {
            jogo.setViewPortX(x);
        }

        //only adjust y to values that ensure the base tiled layer remains visible
        //and no white space is shown
        if (y < ((TiledLayer)this.telasSemColisao.elementAt(0)).getY()) {
            jogo.setViewPortY(((TiledLayer)this.telasSemColisao.elementAt(0)).getY());
        } else if (y > ((TiledLayer)this.telasSemColisao.elementAt(0)).getY() + ((TiledLayer)this.telasSemColisao.elementAt(0)).getHeight() - jogo.getHeight()) {
            jogo.setViewPortY(((TiledLayer)this.telasSemColisao.elementAt(0)).getY() + ((TiledLayer)this.telasSemColisao.elementAt(0)).getHeight() - jogo.getHeight());
        } else {
            jogo.setViewPortY(y);
        }

        //adjust the viewport
        jogo.getLayerManager().setViewWindow(jogo.getViewPortX(), jogo.getViewPortY(), jogo.getWidth(), jogo.getHeight());

    }

    public boolean isBodeVisto(Sprite spriteBode1) {
        //verificar se alguma visão de algum materazzi colidiu com o sprite do bode;
        return false;
    }

    public boolean isComeu(Sprite spriteBode1) {
        //verificar se o bode colidiu com alguma lata virada
        return false;
    }

    public boolean isMudarFase(Sprite spriteBode1) {
        return spriteBode1.collidesWith(this.camadaMudarFase, false);
    }
}
